Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>FOSD program cubes</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/FOSD_program_cubes"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-FOSD_program_cubes rootpage-FOSD_program_cubes skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">FOSD program cubes</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1251242444">
/* start https://en.wikipedia.org/ */


.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style>
<p>In <a href="Feature-oriented_software_development" class="mw-redirect" title="Feature-oriented software development">feature-oriented software development</a>, <b>feature-oriented software development program cubes</b> (<b>FOSD program cubes</b>) are n-dimensional arrays of functions (program transformations) that represent n-dimensional product lines. A <i>program</i> is a composition of features: a base program is augmented with increments in program functionality, called <i>features</i>, to produce a complex program. A <a href="Software_product_line" title="Software product line">software product line</a> (SPL) is a family of related programs. A typical product line has F<sub>0</sub> as a base program, and F<sub>1</sub>..F<sub>n</sub> as features that could be added to F<sub>0</sub>. Different compositions of features yield different programs.
Let + denote the feature composition operation. A program P in SPL might have the following expression:
</p>
<dl><dd>P = F<sub>8</sub> + F<sub>4</sub> + F<sub>2</sub> + F<sub>1</sub> + F<sub>0</sub></dd></dl>
<p>That is, P extends program F<sub>0</sub> with features F<sub>1</sub>, F<sub>2</sub>, F<sub>4</sub>, and F<sub>8</sub> in this order.
</p><p>We can recast P in terms of a projection and contraction of a 1-dimensional array.
Let <b>F</b><sub>i</sub> = [F<sub>0</sub> .. F<sub>n</sub>] denote the array of features used by a product line. A projection of <b>F</b><sub>i</sub> eliminates
unneeded features, yielding a shorter array (call it) <b>G</b><sub>i</sub>. A contraction of <b>G</b><sub>i</sub> sums each <b>G</b><sub>i</sub> in a specific order, to yield a scalar expression. The expression for P becomes:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle P=\sum _{i=(0,1,2,4,8)}\mathbf {F} _{i}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>P</mi>
<mo>=</mo>
<munder>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mn>0</mn>
<mo>,</mo>
<mn>1</mn>
<mo>,</mo>
<mn>2</mn>
<mo>,</mo>
<mn>4</mn>
<mo>,</mo>
<mn>8</mn>
<mo stretchy="false">)</mo>
</mrow>
</munder>
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="bold">F</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle P=\sum _{i=(0,1,2,4,8)}\mathbf {F} _{i}}</annotation>
</semantics>
</math></span><img src="./b693450af7ef6d837b7395920046ea3e4cf5c09a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.505ex; width:16.778ex; height:6.009ex;" alt="{\displaystyle P=\sum _{i=(0,1,2,4,8)}\mathbf {F} _{i}}" loading="lazy"></span></dd></dl>
<p>where the index values accomplish projection and summation is array contraction. This idea
generalizes to n-dimensional arrays that model multi-dimensional product lines.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Multi-dimensional_product_lines">Multi-dimensional product lines</h2></div>

<p>A <i><b>multi-dimensional product line</b></i> is described by multiple interacting sets of features.<sup id="cite_ref-origami_1-0" class="reference"><a href="#cite_note-origami-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
<sup id="cite_ref-sigsoft03_2-0" class="reference"><a href="#cite_note-sigsoft03-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
<sup id="cite_ref-ahead_3-0" class="reference"><a href="#cite_note-ahead-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
<sup id="cite_ref-ECOOP05_4-0" class="reference"><a href="#cite_note-ECOOP05-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
As an elementary 2D example, it is easy to create a product line of calculators, where
variants offer different sets of operations. Another variation
might offer different presentation front ends to calculators, one with no GUI, another
with a Java GUI, a third with a web GUI. These variations interact:
each GUI representation references a specific calculator operation, so each GUI
feature cannot be designed independently of its
calculator feature. Such a design leads to a matrix: columns represent increments in
calculator functionality, and rows represent different presentation front-ends. Such a matrix M is shown to the right: columns allow one to pair
basic calculator functionality (base) with optional logarithmic/exponentiation (lx)
and trigonometric (td) features. Rows allow one to pair core functionality with no
front-end (core), with optional GUI (gui) and web-based (web) front-ends.
</p><p>An element M<sub>ij</sub> implements the interaction of column feature i and row feature j.
For example, the element labeled cb is a base program that implements the core functionality of a calculator. Element gb adds code that displays the core functionality as a GUI; element wb adds code that displays the core functionality via the web. Similarly, element ct adds trigonometric code to the core calculator functionality; elements gt and wt add code to display the trigonometric functionality as a GUI and web front-ends.
</p><p>A calculator is uniquely specified by two sequences of features: one sequence defines the calculator functionality, the other the front-end.
For example, calculator C that offers both base and trig functionality in a web format
is defined by the expression:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle C=M_{cb}+M_{ct}+M_{wb}+M_{wt}=\sum _{i=(core,web) \atop j=(base,td)}\mathbf {M} _{ij}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>C</mi>
<mo>=</mo>
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>c</mi>
<mi>b</mi>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>c</mi>
<mi>t</mi>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>w</mi>
<mi>b</mi>
</mrow>
</msub>
<mo>+</mo>
<msub>
<mi>M</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>w</mi>
<mi>t</mi>
</mrow>
</msub>
<mo>=</mo>
<munder>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac linethickness="0">
<mrow>
<mi>i</mi>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mi>c</mi>
<mi>o</mi>
<mi>r</mi>
<mi>e</mi>
<mo>,</mo>
<mi>w</mi>
<mi>e</mi>
<mi>b</mi>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mi>j</mi>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mi>b</mi>
<mi>a</mi>
<mi>s</mi>
<mi>e</mi>
<mo>,</mo>
<mi>t</mi>
<mi>d</mi>
<mo stretchy="false">)</mo>
</mrow>
</mfrac>
</mrow>
</munder>
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="bold">M</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mi>j</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle C=M_{cb}+M_{ct}+M_{wb}+M_{wt}=\sum _{i=(core,web) \atop j=(base,td)}\mathbf {M} _{ij}}</annotation>
</semantics>
</math></span><img src="./df63ee12383418f55061909b98ced9d5fe07e802.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -5.005ex; width:45.272ex; height:7.509ex;" alt="{\displaystyle C=M_{cb}+M_{ct}+M_{wb}+M_{wt}=\sum _{i=(core,web) \atop j=(base,td)}\mathbf {M} _{ij}}" loading="lazy"></span></dd></dl>
<dl><dd>Note: Each dimension is a collection of base programs and features. Not all of their compositions are meaningful. A <a href="Feature_Model" class="mw-redirect" title="Feature Model">feature model</a> defines the legal combinations of features. Thus, each dimension would have its own feature model. It is possible that selected features along one dimension may preclude or require features along other dimensions. In any case, these feature models define the legal combinations of features in a multidimensional product line.</dd></dl>
<div class="mw-heading mw-heading2"><h2 id="Cubes">Cubes</h2></div>
<p>In general, a <i><b>cube</b></i> is an n-dimensional array. The rank of a cube is its dimensionality.
A scalar is a cube of rank 0, a vector is a cube of rank 1, and a matrix is
rank 2. Following tensor notation: the number of indices a cube has designates
its rank. A scalar S is rank 0 (it has no indices), V<sub>k</sub> is a vector (rank
1), M<sub>ij</sub> is a matrix (rank 2), C<sub>ijk</sub> is a cube (rank 3).
</p><p><i><b>Program Cubes</b></i> are n-dimensional arrays of functions
(program transformations) that represent n-dimensional product lines.
The values along each axis
of a cube denote either a base program or a feature that could elaborate a base program.
The rank of a product line is the rank of its cube.
</p>
<dl><dd>Note: program cubes are inspired by <a href="Tensor" title="Tensor">tensors</a> and <a href="OLAP_cube" title="OLAP cube">data cubes</a> in databases. The primary difference is that data cube elements are numerical values that are added during cube contraction; program cube elements are transformations that are composed. Both use <a href="Tensor" title="Tensor">tensor</a> notations and terminology.</dd></dl>
<p>A program in an n-dimensional SPL is uniquely specified by n sequences of features S<sub>1</sub>..S<sub>n</sub>, one per dimension.
The <i><b>design</b></i> of a program is a scalar (expression) that is formed by (1) projecting the cube
of its unneeded elements, and (2) contracting the resultant kcube to a scalar:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle P=\sum _{i_{1}=S_{1}\dots i_{n}=S_{n}}\mathbf {K} _{i_{1}\dots i_{n}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>P</mi>
<mo>=</mo>
<munder>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<msub>
<mi>i</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>=</mo>
<msub>
<mi>S</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>…<!-- … --></mo>
<msub>
<mi>i</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo>=</mo>
<msub>
<mi>S</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
</mrow>
</munder>
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="bold">K</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<msub>
<mi>i</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>…<!-- … --></mo>
<msub>
<mi>i</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle P=\sum _{i_{1}=S_{1}\dots i_{n}=S_{n}}\mathbf {K} _{i_{1}\dots i_{n}}}</annotation>
</semantics>
</math></span><img src="./95eff0b944b688a46efd05e28a220eb474255f91.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.338ex; width:23.64ex; height:5.843ex;" alt="{\displaystyle P=\sum _{i_{1}=S_{1}\dots i_{n}=S_{n}}\mathbf {K} _{i_{1}\dots i_{n}}}" loading="lazy"></span></dd></dl>
<p>Program <i><b>generation</b></i> is evaluating the scalar expression to produce program P.
</p><p>An interesting property of cube design is that the order in which dimensions are contracted does not
matter—any permutation of dimensions during contraction results in a different
scalar expression (i.e. a different program design), but all expressions produce the
same value (program). For example, another expression (design) to produce calculator C contracts
dimensions in the opposite order from its original specification:
</p>
<dl><dd>C = M<sub>cb</sub> + M<sub>wb</sub> + M<sub>ct</sub> + M<sub>wt</sub></dd></dl>
<p>Or more generally:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle P=\sum _{i_{n}=S_{n}\dots i_{1}=S_{1}}\mathbf {K} _{i_{1}\dots i_{n}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>P</mi>
<mo>=</mo>
<munder>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<msub>
<mi>i</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo>=</mo>
<msub>
<mi>S</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo>…<!-- … --></mo>
<msub>
<mi>i</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>=</mo>
<msub>
<mi>S</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mrow>
</munder>
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="bold">K</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<msub>
<mi>i</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>…<!-- … --></mo>
<msub>
<mi>i</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle P=\sum _{i_{n}=S_{n}\dots i_{1}=S_{1}}\mathbf {K} _{i_{1}\dots i_{n}}}</annotation>
</semantics>
</math></span><img src="./a1fe709c2e4c73e0ff39da25ced1bb27bfecc3a9.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.338ex; width:23.64ex; height:5.843ex;" alt="{\displaystyle P=\sum _{i_{n}=S_{n}\dots i_{1}=S_{1}}\mathbf {K} _{i_{1}\dots i_{n}}}" loading="lazy"></span></dd></dl>
<dl><dd>Note: Underlying cube designs is a <a href="Commutative_diagram" title="Commutative diagram">commutative diagram</a>, such that there are an exponential number of paths from the empty program 0 to program P. Each path denotes a particular contraction of a cube, and corresponds to a unique incremental design of P. Included among these paths are cube aggregations that contract cubes using different dimensional orders.</dd></dl>
<p>The significance of program cubes is that it provides a structured way in which to
express and build multi-dimensional models of SPLs. Further, it provides scalable
specifications. If each dimension has k values, an n-cube specification of a program
requires O(kn) terms, as opposed to O(k<sup>n</sup>) cube elements that would otherwise
have to be identified and then composed. In general, cubes provide a compact way
to specify complex programs.
</p>
<div class="mw-heading mw-heading2"><h2 id="Applications">Applications</h2></div>
<p>The <a href="Expression_problem" title="Expression problem">expression problem</a> (a.k.a. the '<i>extensibility problem</i>) is a fundamental problem in programming languages aimed at type systems that can add new classes and methods to a program in a type-safe manner.<sup id="cite_ref-Reynolds_5-0" class="reference"><a href="#cite_note-Reynolds-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Cook_6-0" class="reference"><a href="#cite_note-Cook-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Wadler_7-0" class="reference"><a href="#cite_note-Wadler-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Synth_8-0" class="reference"><a href="#cite_note-Synth-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup>
It is also a fundamental problem in multi-dimensional SPL design. The expression problem is an example of an SPL of rank 2. The following applications either explain/illustrate the expression problem or show how it scales to product lines of large programs. EP is really a SPL of ~30 line programs; the applications below show how these ideas scale to programs of &gt;30K lines (a 10<sup>3</sup> increase in size).
</p>
<ul><li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122152/ftp://ftp.cs.utexas.edu/pub/predator/ECOOP2005.pdf">Expression Problem</a></li>
<li><a rel="nofollow" class="external text" href="http://www.cs.utexas.edu/users/schwartz/ATS/EPL/index.html">Illustration of Small Expression Problem</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706014148/ftp://ftp.cs.utexas.edu/pub/predator/Origami.pdf">Extensible IDEs</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706014145/ftp://ftp.cs.utexas.edu/pub/predator/OrigamiMDSC.pdf">Multi-Dimensional Separation of Concerns</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122700/ftp://ftp.cs.utexas.edu/pub/predator/TSE-AHEAD.pdf">Calculator Product Line</a></li></ul>
<p>Also, <a href="FOSD_metamodels" title="FOSD metamodels">FOSD metamodels</a> can be viewed as special cases of program cubes.
</p>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-origami-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-origami_1-0">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706014148/ftp://ftp.cs.utexas.edu/pub/predator/Origami.pdf">"Generating Product-Lines of Product-Families"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/Origami.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-sigsoft03-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-sigsoft03_2-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706014145/ftp://ftp.cs.utexas.edu/pub/predator/OrigamiMDSC.pdf">"Refinements and Multi-Dimensional Separation of Concerns"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/OrigamiMDSC.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-ahead-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-ahead_3-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122700/ftp://ftp.cs.utexas.edu/pub/predator/TSE-AHEAD.pdf">"Scaling Step-Wise Refinement"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/TSE-AHEAD.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-ECOOP05-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-ECOOP05_4-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170706122152/ftp://ftp.cs.utexas.edu/pub/predator/ECOOP2005.pdf">"Evaluating Support for Features in Advanced Modularization Technologies"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="ftp://ftp.cs.utexas.edu/pub/predator/ECOOP2005.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-07-06.</cite></span>
</li>
<li id="cite_note-Reynolds-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-Reynolds_5-0">^</a></b></span> <span class="reference-text">
<cite class="citation book cs1"><a rel="nofollow" class="external text" href="http://portal.acm.org/citation.cfm?id=186680"><i>User-defined types and procedural data structures as complementary approaches to data abstraction</i></a>. MIT Press. 12 August 1994. pp.&nbsp;<span class="nowrap">13–</span>23. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>9780262071550</bdi>.</cite></span>
</li>
<li id="cite_note-Cook-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-Cook_6-0">^</a></b></span> <span class="reference-text">
<cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.cs.utexas.edu/users/wcook/papers/OOPvsADT/CookOOPvsADT90.pdf">"Object-Oriented Programming versues Abstract Data Types"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-Wadler-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-Wadler_7-0">^</a></b></span> <span class="reference-text">
<cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.daimi.au.dk/~madst/tool/papers/expression.txt">"The Expression Problem"</a>.</cite></span>
</li>
<li id="cite_note-Synth-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-Synth_8-0">^</a></b></span> <span class="reference-text">
<cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://citeseer.ist.psu.edu/krishnamurthi98synthesizing.html">"Synthesizing Object-Oriented and Functional Design to Promote Re-Use"</a>.</cite></span>
</li>
</ol></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-05-27" href="https://en.wikipedia.org/wiki/?title=FOSD_program_cubes&amp;oldid=1292519519">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>